// 这个中间件作用是路由地址的权限控制
import jwt = require('jsonwebtoken');

module.exports = (options, app) => {
  return async function(ctx, next) {
    // 1.获取需要权限控制的路由地址
    const authUrls = options.authUrls;
    // 2.判断当前请求的路由地址是否需要权限控制
    if (authUrls.includes(ctx.url)) {
      // 需要权限控制
      // 3.获取客户端传递过来的JWT令牌
      // const token = ctx.get('authorization');
      // 🔔注意点: 在设置cookies时如果设置了 signed: false 则获取的时候也要设置，避免获取不到cookie值
      const token = ctx.cookies.get('token', {
        signed: false,
      });
      // 4.判断客户端有没有传递JWT令牌
      if (token) {
        try {
          // 验证JWT令牌是否正确
          await jwt.verify(token, app.config.keys);
          await next();
        } catch (e) {
          ctx.error(400, '没有权限');
        }
      } else {
        ctx.error(400, '没有权限');
      }
    } else {
      // 不需要权限
      await next();
    }
  };
};
